package com.zyl.blog.rbac.service.rbac;

import com.github.yulichang.base.MPJBaseService;
import com.zyl.blog.common.domain.data.vo.LogVO;
import com.zyl.blog.common.domain.rbac.bean.User;
import com.zyl.blog.common.domain.rbac.dto.LoginDTO;
import com.zyl.blog.common.domain.rbac.dto.RegisterDTO;
import com.zyl.blog.common.domain.rbac.dto.UserDTO;
import com.zyl.blog.common.domain.rbac.vo.LoginResultVO;
import com.zyl.blog.common.domain.rbac.vo.user.UserInfoVO;
import com.zyl.blog.common.response.Result;

/**
 * @version v1.0
 * @ProjectName: Personal_Blog
 * @Package: com.zyl.service
 * @ClassName: RbacService
 * @Description:
 * @Author FinalFantasy
 * @Date 2025/6/23-15:55
 */
public interface UserService extends MPJBaseService<User> {

    /**
     * 用户登录业务实现
     *
     * @param loginDTO 登录载荷DTO
     * @return {@link LoginResultVO }
     */
    LoginResultVO  doLogin(LoginDTO loginDTO);

    /**
     * 用户注册业务实现
     *
     * @param registerDTO 注册载荷DTO
     * @return {@link Result }
     */
    Result<?> doRegister(RegisterDTO registerDTO);

    /**
     * 获取登录用户详情（包含角色+权限+全关联信息）
     * @param userId 用户Id
     * @return 用户业务对象
     */
    UserInfoVO fetchUserInfoWithAllRelations(Long userId);

    /**
     * 获取用户信息业务（加密）
     * @param userId 用户ID
     * @return {@link String }
     */
    String getUserInfo(Long userId);

    /**
     * 获取用户信息业务（非加密）
     * @param userId 用户ID
     * @return {@link UserInfoVO }
     */
    UserInfoVO getUserInfoAll(Long userId);

    /**
     * 根据用户ID获取日志所需的用户信息
     *
     * @param userId 用户ID
     * @return 日志用户信息视图对象
     */
    LogVO getLogVO(Long userId);

    /**
     * 新增用户
     * @param dto 用户DTO（走AddGroup校验）
     * @return 操作结果
     */
    Result<?> addUser(UserDTO dto);

    /**
     * 编辑用户
     * @param dto 用户DTO（走UpdateGroup校验）
     * @return 操作结果
     */
    Result<?> updateUser(UserDTO dto);

    /**
     * 退出登录
     *
     * @return {@link Result }<{@link ? }>
     */
    Result<?> logout();

    /**
     * 强制退出所有端的登录
     *
     * @return {@link Result }<{@link ? }>
     */
    Result<?> forceLogoutAll();
}
